package com.dys.teststreamapi11;

import com.dys.testlambda02.entity.Person;

import java.util.stream.Stream;

/**
 * @className: com.dys.teststreamapi11.StreamAPITest
 * @description: Stream流的函数拼接：reduce方法
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/01 下午4:39
 */
public class StreamAPITest07 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        streamReduceAndMap();
    }

    /**
     * 如果需要将所有数据归纳得到一个数据，可以使用reduce方法
     */
    private static void streamReduce() {
        Integer sum = Stream.of(1, 2, 3, 4, 5, 6)
                // identity默认值
                // 第一次的时候会将默认值赋值给x
                // 之后每次会将 上一次的操作结果赋值给x y就是每次从数据中获取的元素
                .reduce(0, (x, y) -> {
                    System.out.println("x=" + x + ",y=" + y);
                    return x + y;
                });
        System.out.println(sum);
    }

    /**
     * 获取最大值
     */
    private static void streamReduceMax() {
        Integer max = Stream.of(11, 22, 33, 88, 44)
                .reduce(0, (x, y) -> x > y ? x : y);
        System.out.println("最大值是：" + max);
    }

    /**
     * 实际开发中我们经常会将map和reduce一块来使用
     */
    private static void streamReduceAndMap() {

        // 1.求出所有年龄的总和
        Integer sum = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 22),
                        new Person("李思思", 23),
                        new Person("黄晓彤", 20))
                .map((p) -> p.getAge())
                .reduce(0, (x, y) -> x + y);
        System.out.println("年龄之和是：" + sum);

        // 2.求出所有年龄中的最大值
        Integer ageMax = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 32),
                        new Person("李思思", 23),
                        new Person("黄晓彤", 20))
                .map(Person::getAge)
                .reduce(0, Integer::max);
        System.out.println("最大年龄：" + ageMax);

        // 3.统计字符a出现的次数
        Integer count = Stream.of("a", "b", "c", "d", "e", "f", "a")
                .map(ch -> "a".equals(ch) ? 1 : 0)
                .reduce(0, Integer::sum);
        System.out.println("字符a出现的次数为：" + count);
    }

}
